Azure App Service 証明書を AWS Certificate Manager へインポートしてみた
いわさです。
以下の記事で App Service 証明書を購入して使ってみたのですが、App Service 証明書について調べている中で、Azure 外でも利用出来ることを知りました。
一方で AWS Certificate Manager (ACM) では証明書のインポートを行うことが出来ます。
ユースケースが全く思い浮かばないですが、興味本位で Azure App Service 証明書を ACM にインポート出来るのかを試してみました。
App Service 証明書をエクスポート
まず、App Service 証明証については以下のように購入済みです。
そして、Azure App Service Team Blob の以下の情報を頼りに証明書のエクスポートを行います。
この手順では証明書エクスポート用の関数を定義して利用しています。
ほぼそのまま使ったのですが、私は macOS で利用していたので以下のようにパス部分だけ変更しました。
元のスクリプトだと期待した位置にダウンロードされませんでした。(Windows だとうまくいった)
Function Export-AppServiceCertificate { : $currentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath [Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath [io.file]::WriteAllBytes("appservicecertificate.pfx",$pfxCertObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12,$pfxPassword)) : # Print the password for the exported certificate Write-Host "Created an App Service Certificate copy at: $currentDirectory/appservicecertificate.pfx" Write-Warning "For security reasons, do not store the PFX password. Use it directly from the console as required." Write-Host "PFX password: $pfxPassword" }
そして、定義したExport-AppServiceCertificate
を使ってみます。
処理の中でConnect-AzAccount
が使われているので以下のように認証を行います。
成功すると以下のように PFX ファイルが生成され、PFX のパスワードがコンソール上に表示されていると思います。
> Export-AppServiceCertificate -loginId [email protected] -subscriptionId aaaaaaaa-1111-2222-3333-444444444444 -resourceGroupName common -name azuretak1wacom WARNING: TenantId 'aaaaaaaa-1111-2222-3333-444444444444' contains more than one active subscription. First one will be selected for further use. To select another subscription, use Set-AzContext. To override which subscription Connect-AzAccount selects by default, use `Update-AzConfig -DefaultSubscriptionForLogin 00000000-0000-0000-0000-000000000000`. Go to https://go.microsoft.com/fwlink/?linkid=2200610 for more information. Account SubscriptionName TenantId Environment ------- ---------------- -------- ----------- [email protected] hoge subscription aaaaaaaa-1111-2222-3333-444444444444 AzureCloud Name : hoge subscription (aaaaaaaa-1111-2222-3333-444444444444) - aaaaaaaa-1111-2222-3333-444444444444 - [email protected] Account : [email protected] Environment : AzureCloud Subscription : aaaaaaaa-1111-2222-3333-444444444444 Tenant : aaaaaaaa-1111-2222-3333-444444444444 TokenCache : VersionProfile : ExtendedProperties : {} Get Secret Access to account [email protected] has been granted from the KeyVault, please check and remove the policy after exporting the certificate Created an App Service Certificate copy at: /Users/iwasa.takahito/work/hoge0910cert/appservicecertificate.pfx WARNING: For security reasons, do not store the PFX password. Use it directly from the console as required. PFX password: <hogehoge password>
AWS Certificate Manger (ACM) へインポート
続いて ACM へインポートしたいと思いますが、インポートする前にいくつか準備が必要です。
先程生成された証明書は PFX 形式なので、ACM へインポートするために PEM 形式に変換する必要があります。
以下の記事を参考に OpenSSL を使って変換をしていきたいと思います。
秘密鍵
以下のコマンドを実行して PFX ファイルから証明書の秘密鍵を抽出します。
先程表示されたパスワードを入力してもエラーになる場合は、パスワードを外部ファイルとして読み込ませてみてください。
# openssl pkcs12 -in ./appservicecertificate.pfx -nocerts -out privatekey.pem Enter Import Password: Can't read Password # openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -nocerts -out privatekey.pem MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
秘密鍵が抽出されたら、暗号化を解除します。
このとき、ACM ではパスフレーズが設定された秘密鍵のインポートが出来ないということを知りました。
# openssl rsa -in ./privatekey.pem -out withoutpw-privatekey.pem Enter pass phrase for ./privatekey.pem: writing RSA key
証明書
以下のコマンドを実行して PFX ファイルから証明書を抽出します。
# openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -clcerts -nokeys -out cert-file.pem MAC verified OK
中間 CA
こちらは以下のコマンドで抽出することになっているのですが...
# openssl pkcs12 -in ./appservicecertificate.pfx -passin file:hoge.txt -cacerts -nokeys -chain -out ca-chain.pem MAC verified OK # ls -l total 40 -rw-r--r-- 1 iwasa.takahito staff 3295 9 10 18:06 appservicecertificate.pfx -rw-r--r-- 1 iwasa.takahito staff 0 9 10 18:41 ca-chain.pem -rw-r--r-- 1 iwasa.takahito staff 2570 9 10 18:39 cert-file.pem -rw-r--r-- 1 root staff 51 9 10 18:33 hoge.txt -rw-r--r-- 1 iwasa.takahito staff 1910 9 10 18:34 privatekey.pem -rw-r--r-- 1 iwasa.takahito staff 1679 9 10 18:38 withoutpw-privatekey.pem
0 byte ですね。
先程の Azure App Service Team Blog にも記載されていますが、先程エクスポートした PFX ファイルには中間証明書が含まれていません。
PEM に変換しない場合でも一度証明書をインストールして中間証明書を含む形でエクスポートし直す必要があるようです。
その際にはこちらからダウンロードを行います。
PFX 形式の場合はまとめなおす必要があったのですが、今回は ACM へのインポートなのでこちらをca-chain.pem
として使用しました。
使ってみる
ここまでで ACM としては構成が完了したので、最後に使ってみます。
いつもの検証用の ALB - EC2 環境をデプロイします。
こちらは HTTP での構成になっているので、ALB に対してカスタムドメインでの HTTPS リスナーを追加します。
あとはセキュリティグループで HTTPS のアクセスを許可し、ALB への名前解決を行うエイリアスレコードを作成しました。
確認してみましょう。
# curl -v https://azure.tak1wa.com/ : * Server certificate: * subject: CN=azure.tak1wa.com * start date: Sep 8 07:04:17 2022 GMT * expire date: Sep 8 07:04:17 2023 GMT * subjectAltName: host "azure.tak1wa.com" matched cert's "azure.tak1wa.com" * issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2 * SSL certificate verify ok. * Using HTTP2, server supports multiplexing : hoge
良さそうですかね。
さいごに
本日は Azure App Service 証明書を AWS Certificate Manager へインポートしてみました。
出来るのか出来ないのわからなかったのですが、出来ました。
ただ ACM ではインポートされた証明書は自動更新管理の対象外ですし App Service 証明書も DV 証明書なので、管理の手間が増えただけで利用することはあまり無いような気がしました。普通に Azure 側と AWS 側とどちらでもマネージド証明書をリクエストしたほうが良いかなという感じです。